#ifndef _I2C_H_
#define _I2C_H_

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "systick.h"

// 使用PB6作为SCL, PB7作为SDA
// 软件模拟方式实际上可以使用任意GPIO引脚
#define I2C_Port GPIOB
#define I2C_Pin_SCL GPIO_Pin_6
#define I2C_Pin_SDA GPIO_Pin_7

typedef enum
{
    I2C_NOACK = 0,
    I2C_ACK
} I2C_ACKTypeDef;

/**
 * @brief I2C的初始化
 * 不使用I2C硬件, 因此不需要调用标准库的I2C_InitTypeDef这些东西
 * 而是将某两个引脚配置为GPIO非复用即可
 * 
 */
void myI2C_Init(void);

/**
 * @brief 以主机的角度, 产生一个起始信号
 * 
 */
void I2C_Start(void);

/**
 * @brief 以主机的角度, 产生一个停止信号
 * 
 */
void I2C_Stop(void);

/**
 * @brief 
 * 主机作为发送方时, 发送数据对应8个bit值的过程
 * @param data 
 */
void I2C_SendByte(uint8_t data);

 /**
  * @brief 
  * 主机作为接收方时, 接收8个bit数据的过程
  * @param flagAck 是否附带响应
  * @return uint8_t 收到的数据
  */
uint8_t I2C_RecvByte(I2C_ACKTypeDef flagAck);

/**
 * @brief 
 * 主机作为接收方, 等待对方的响应
 * 
 */
I2C_ACKTypeDef I2C_WaitForAck(void);

#endif // _I2C_H_
